S1. PRISMA checklist



S2. Deviations from protocol

1. Data extraction

  • Some planned study-level data were not extracted from the reports (e.g., attrition) because values were not consistent with the sample used in the analyses (due - for example - to our inclusion criteria regarding the age of participants)

2. Data analysis

Several analyses were not conducted, and others were added post-hoc.

  • Analyses removed: using multiple imputation to handle missing data (due to technical failure for a high number of cohorts) and restricting to cohorts with a low attrition (due to the impossibility to include participants (or to retrieve data of participants) with missing data for a high number of cohorts)

  • Analyses added post-hoc: S8, S10, S11.1, & S11.2



S3. List of tools

To do



S4. Search strategies



S5. Excluded studies

To do



S6. Example of script



S7. Descriptive analyses

Location of studies

ES distribution

Description

dat_map$continent = c("Oceania", "Asia", "America", "America", "Asia", "Europe", "Africa", "Europe", "Europe", "Europe", "Europe", "Europe", "Oceania", "Europe", "Europe", "Europe", "Africa", "Europe", "America")
continent = dat_map %>%
  group_by(continent) %>%
  summarise(n_studies = sum(n_studies)) 

paste0(
  "Among them, we were able to access the data of ",
  length(unique(dat_main$ID)),
  " unique studies, and we were able to collect raw data from ",
  sum(dat_main[!duplicated(dat_main$ID),]$raw_data=="YES"),
  " studies Out of the ",
  length(unique(dat_main$ID)),
  " studies, ",
  continent[continent$continent=="America", ]$n_studies,
  " were conducted in America (",
  "among which ",
  dat_map[dat_map$COUNTRY=="USA",]$n_studies,
  " were conducted in the USA), ",
  continent[continent$continent=="Europe", ]$n_studies,
  " in Europe, ",
  continent[continent$continent=="Oceania", ]$n_studies,
  " in Africa, ",
  continent[continent$continent=="Asia", ]$n_studies,
  " in Asia, and ",
  continent[continent$continent=="Africa", ]$n_studies,
  " in Oceania. The number of participants per study ranged from ",
  min(as.numeric(dat_main$N)),
  " to ",
  max(as.numeric(dat_main$N)),
  ". The mean length of follow up ranged from ",
  min(as.numeric(dat_main$followupduration)),
  " years to ",
  round(max(as.numeric(dat_main$followupduration))),
  " years. Among the ", 
    sum(dat_main[!duplicated(dat_main$ID),]$Cut_off_date=="Official"),
  " studies included in our main analyses, ",
  sum(dat_main[!duplicated(dat_main$ID),]$diag.procedure=="Diagnosis", na.rm=TRUE),
  " studies categorized ADHD using a formal diagnostic procedure, ",
  sum(dat_main[!duplicated(dat_main$ID),]$diag.procedure=="Symptoms", na.rm=TRUE),
" based on symptoms count, and ",
  sum(dat_main[!duplicated(dat_main$ID),]$diag.procedure=="Broad-based-scale", na.rm=TRUE),
  " based on the results of broad-based scales (such as the CBCL or SDQ)."
)
## [1] "Among them, we were able to access the data of 58 unique studies, and we were able to collect raw data from 34 studies Out of the 58 studies, 26 were conducted in America (among which 23 were conducted in the USA), 22 in Europe, 5 in Africa, 3 in Asia, and 2 in Oceania. The number of participants per study ranged from NA to NA. The mean length of follow up ranged from NA years to NA years. Among the 42 studies included in our main analyses, 33 studies categorized ADHD using a formal diagnostic procedure, 14 based on symptoms count, and 11 based on the results of broad-based scales (such as the CBCL or SDQ)."



S8. RAE baseline

Relative age effect at baseline

colnames(df.base.mob)[1:4] = paste0(colnames(df.base.mob)[1:4], "_base")
df.base.mob[,1:4] <- lapply(df.base.mob[,1:4], function(x) as.numeric(as.character(x)))

dat_baseline = dplyr::left_join(df.base.mob, unique(dat_main[, c("Study", "study_ID", "Study_name", "Cut_off_date")])) 
## Joining, by = c("Study", "Study_name", "Cut_off_date")
res_mob_baseline <- meta::metagen(TE = logOR_base,
                        seTE = seOR_base,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_baseline$N_base),
                        sm = "OR",
                        studlab = paste(dat_baseline$Study_name),
                        data = dat_baseline)
res_mob_baseline
## Number of studies combined: k = 9
## Number of observations: o = 88753
## 
##                          OR           95%-CI    z  p-value
## Common effect model  1.0357 [1.0268; 1.0446] 7.99 < 0.0001
## Random effects model 1.0401 [1.0224; 1.0582] 4.48 < 0.0001
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0003 [0.0000; 0.0032]; tau = 0.0184 [0.0000; 0.0566]
##  I^2 = 49.8% [0.0%; 76.6%]; H = 1.41 [1.00; 2.07]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  15.95    8  0.0431
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_mob_baseline,
           title = "Association of MoB with \n childhood ADHD")



S9. Primary analysis

Main model

res_prim <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_prim$N),
                        sm = "OR",
                        studlab = paste(dat_prim$Study_name),
                        data = dat_prim)
res_prim
## Number of studies combined: n = 42
## Number of estimates combined: k = 44
## Number of observations: o = 4743
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0242 [0.9896; 1.0600] 1.36  0.1733
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0043 [0.0000; 0.0119]; tau.1 = 0.0656 [0.0000; 0.1092] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0078]; tau.2 < 0.0001 [0.0000; 0.0881] (within cluster)
##  I^2 = 43.4% [19.0%; 60.5%]; H = 1.33 [1.11; 1.59]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  76.01   43  0.0014
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau
# as per protocol
dat_prim$vi=dat_prim$seOR^2
res <- metafor::rma.uni(logOR ~ 1, vi = vi, data = dat_prim, level = 90)
res

predict(res, transf=exp)

W <- diag(1/res$vi)
X <- model.matrix(res)
P <- W - W %*% X %*% solve(t(X) %*% W %*% X) %*% t(X) %*% W
100 * sum(res$sigma2) / (sum(res$sigma2) + (res$k-res$p)/sum(diag(P)))

Forest plot

fct_forest(data = res_prim,
           title = "Association of MoB with \n persistence of ADHD")

Equivalence tests

tost = metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim, level = 90)
## [1] "Even if one considers OR=0.99 to be a practically significant value, post-hoc equivalence tests would show that even if relative age leads to a decrease in the persistence of ADHD, this effect is extremely small OR=0.995"



S10. Cohorts with RAE assessment

Main model

dat_rae = subset(dat_prim, Study %in% dat_baseline$Study)
dat_rae$p_sig = ifelse(dat_rae$Study %in% subset(dat_baseline, pOR_base < 0.05)$Study, "RAE at baseline: sig", "RAE at baseline: ns")
dat_rae$or_larg = ifelse(dat_rae$Study %in% subset(dat_baseline, exp(logOR_base) >= 1.05)$Study, "RAE at baseline: large", "RAE at baseline: small")
res_rae <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Study_name),
                        data = dat_rae)

res_rae_p = meta::metareg(res_rae, formula = p_sig, intercept = TRUE)
res_rae_or = meta::metareg(res_rae, formula = or_larg, intercept = TRUE)
res_rae_p_woi = meta::metareg(res_rae, formula = p_sig, intercept = FALSE)
res_rae_or_woi = meta::metareg(res_rae, formula = or_larg, intercept = FALSE)
res_rae_p
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0007)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## R^2 (amount of heterogeneity accounted for):            0.00%
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 5.5244, p-val = 0.5962
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 1.8114, p-val = 0.1783
## 
## Model Results:
## 
##                            estimate      se     zval    pval    ci.lb   ci.ub 
## intrcpt                     -0.0394  0.0395  -0.9961  0.3192  -0.1168  0.0381 
## p_sigRAE at baseline: sig    0.0566  0.0421   1.3459  0.1783  -0.0258  0.1390 
##  
## intrcpt 
## p_sigRAE at baseline: sig 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_or
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0006)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## R^2 (amount of heterogeneity accounted for):            0.00%
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 6.3419, p-val = 0.5004
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.9938, p-val = 0.3188
## 
## Model Results:
## 
##                                estimate      se     zval    pval    ci.lb 
## intrcpt                          0.0635  0.0548   1.1596  0.2462  -0.0439 
## or_largRAE at baseline: small   -0.0564  0.0565  -0.9969  0.3188  -0.1672 
##                                 ci.ub 
## intrcpt                        0.1709    
## or_largRAE at baseline: small  0.0545    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_p_woi
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0007)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 5.5244, p-val = 0.5962
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 2.4254, p-val = 0.2974
## 
## Model Results:
## 
##                            estimate      se     zval    pval    ci.lb   ci.ub 
## p_sigRAE at baseline: ns    -0.0394  0.0395  -0.9961  0.3192  -0.1168  0.0381 
## p_sigRAE at baseline: sig    0.0172  0.0144   1.1972  0.2312  -0.0110  0.0455 
##  
## p_sigRAE at baseline: ns 
## p_sigRAE at baseline: sig 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_rae_or_woi
## 
## Mixed-Effects Model (k = 9; tau^2 estimator: REML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0 (SE = 0.0006)
## tau (square root of estimated tau^2 value):             0
## I^2 (residual heterogeneity / unaccounted variability): 0.00%
## H^2 (unaccounted variability / sampling variability):   1.00
## 
## Test for Residual Heterogeneity:
## QE(df = 7) = 6.3419, p-val = 0.5004
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 1.6078, p-val = 0.4476
## 
## Model Results:
## 
##                                estimate      se    zval    pval    ci.lb 
## or_largRAE at baseline: large    0.0635  0.0548  1.1596  0.2462  -0.0439 
## or_largRAE at baseline: small    0.0072  0.0140  0.5130  0.6079  -0.0202 
##                                 ci.ub 
## or_largRAE at baseline: large  0.1709    
## or_largRAE at baseline: small  0.0345    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_rae_p_sub <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        subgroup = dat_rae$p_sig,
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Study_name),
                        data = dat_rae)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
res_rae_or_sub <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        subgroup = dat_rae$or_larg,
                        n.e = as.numeric(dat_rae$N),
                        sm = "OR",
                        studlab = paste(dat_rae$Study_name),
                        data = dat_rae)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_rae_p_sub,
           title = "Association of MoB with \n persistence of ADHD")

fct_forest(data = res_rae_or_sub,
           title = "Association of MoB with \n childhood ADHD")



S11. Sensitivity/moderation analyses

1. Truncated MoB

Main model

dat_trunc_meta$Analysis = "Truncated MoB"

df_trunc = rbind(
  dat_trunc_meta,
  dat_prim[,c(colnames(dat_trunc_meta))]) %>%
    group_by(Study) %>%
    mutate(n=n()) %>%
    filter(n>1)

df_trunc[1:4] <- apply(df_trunc[1:4], 2, as.numeric)

V.SCE  <- with(df_trunc,
  clubSandwich::impute_covariance_matrix(
    vi = seOR^2, 
    cluster = Study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = Analysis))
## Registered S3 method overwritten by 'clubSandwich':
##   method    from    
##   bread.mlm sandwich
res_trunc <- metafor::rma.mv(yi= logOR, V = V.SCE,
                       data = df_trunc, 
                       mods = ~ Analysis - 1,
                       random = ~ Analysis | Study,
                       struct = "DIAG",
                       sparse = TRUE)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
# metafor::profile.rma.mv(res_trunc)
res_trunc
## 
## Multivariate Meta-Analysis Model (k = 46; method: REML)
## 
## Variance Components:
## 
## outer factor: Study    (nlvls = 23)
## inner factor: Analysis (nlvls = 2)
## 
##             estim    sqrt  k.lvl  fixed          level 
## tau^2.1    0.0000  0.0000     23     no        Primary 
## tau^2.2    0.0000  0.0000     23     no  Truncated MoB 
## 
## Test for Residual Heterogeneity:
## QE(df = 44) = 38.3652, p-val = 0.7111
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 4.4280, p-val = 0.1093
## 
## Model Results:
## 
##                        estimate      se    zval    pval    ci.lb   ci.ub 
## AnalysisPrimary          0.0471  0.0225  2.0928  0.0364   0.0030  0.0912  * 
## AnalysisTruncated MoB    0.0049  0.0225  0.2195  0.8263  -0.0392  0.0490    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

2. Dichotomized MoB

dat_d3$Analysis = "Dichotomized MoB"

dat_d3[1:4] <- apply(dat_d3[1:4], 2, as.numeric)
res_dich <- meta::metagen(TE = logOR,
                          seTE = seOR,
                          id = study_ID,
                          method.tau = "REML",
                          n.e = as.numeric(dat_d3$N),
                          sm = "OR",
                          studlab = paste(dat_d3$Study_name),
                          data = dat_d3)
res_dich
## Number of studies combined: n = 26
## Number of estimates combined: k = 27
## Number of observations: o = 1440
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.2741 [0.9826; 1.6522] 1.83  0.0677
## 
## Quantifying heterogeneity:
##  tau^2.1 < 0.0001 [0.0000; 0.4107]; tau.1 = 0.0003 [0.0000; 0.6409] (between cluster)
##  tau^2.2 = 0      [0.0000; 0.2880]; tau.2 = 0      [0.0000; 0.5367] (within cluster)
##  I^2 = 0.0% [0.0%; 42.5%]; H = 1.00 [1.00; 1.32]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  15.81   26  0.9407
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau
fct_forest(data = res_dich,
           title = "Association of MoB with \n persistence of ADHD")

3. Follow-up > 10yo

Main model

dat_S2 <- data.frame(subset(dat_off, grepl("S1:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID)

res_S2 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S2$N),
                        sm = "OR",
                        studlab = paste(dat_S2$Study_name),
                        data = dat_S2)
res_S2
## Number of studies combined: k = 10
## Number of observations: o = 446
## 
##                          OR           95%-CI     z p-value
## Common effect model  0.9975 [0.9395; 1.0592] -0.08  0.9357
## Random effects model 0.9978 [0.9143; 1.0889] -0.05  0.9604
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0093 [0.0000; 0.0481]; tau = 0.0965 [0.0000; 0.2193]
##  I^2 = 49.2% [0.0%; 75.4%]; H = 1.40 [1.00; 2.02]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  17.72    9  0.0386
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S2,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

4. Age <=8 baseline & >=16 follow up

Main model

dat_S3 <- data.frame(subset(dat_off, grepl("S2:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID)

res_S3 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S3$N),
                        sm = "OR",
                        studlab = paste(dat_S3$Study_name),
                        data = dat_S3)
res_S3
## Number of studies combined: k = 10
## Number of observations: o = 331
## 
##                          OR           95%-CI     z p-value
## Common effect model  0.9793 [0.9127; 1.0508] -0.58  0.5608
## Random effects model 0.9659 [0.8590; 1.0860] -0.58  0.5616
## 
## Quantifying heterogeneity:
##  tau^2 = 0.0198 [0.0027; 0.1314]; tau = 0.1409 [0.0516; 0.3625]
##  I^2 = 61.6% [23.6%; 80.7%]; H = 1.61 [1.14; 2.28]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  23.46    9  0.0052
## 
## Details on meta-analytical method:
## - Inverse variance method
## - Restricted maximum-likelihood estimator for tau^2
## - Q-Profile method for confidence interval of tau^2 and tau

Forest plot

meta::forest(res_S3,
             smlab = "Association of MoB with \n persistence of ADHD",
             lab.e = "",
             comb.fixed = FALSE,
             text.random    = "Pooled Effect Size",
             print.tau2 = TRUE,
             prediction = TRUE,
             xlim = c(0.5, 2),
             col.predict = "black",
             digits.se = 2,
             leftcols = c("studlab", "n.e"),
             leftlabs = c("Study", "N"),
             col.diamond.random = "#9B1B1B",
             col.diamond.lines.random   = "#9B1B1B")

5. Same ADHD tool baseline & follow up

Main model

dat_S4 <- data.frame(subset(dat_off, grepl("S3:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID)

res_S4 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S4$N),
                        sm = "OR",
                        studlab = paste(dat_S4$Study_name),
                        data = dat_S4)
res_S4
## Number of studies combined: n = 17
## Number of estimates combined: k = 19
## Number of observations: o = 2853
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0592 [1.0069; 1.1143] 2.22  0.0261
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0047 [0.0000; 0.0176]; tau.1 = 0.0683 [0.0000; 0.1326] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0075]; tau.2 < 0.0001 [0.0000; 0.0869] (within cluster)
##  I^2 = 52.1% [19.1%; 71.6%]; H = 1.45 [1.11; 1.88]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  37.59   18  0.0044
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S4,
           title = "Association of MoB with \n childhood ADHD")



S12. Robustness checks

1. Jackknife meta-analysis

repNA = rep(NA, length(unique(dat_prim$study_ID)))
res.JK = data.frame(es=repNA, ci_lo = repNA, ci_up = repNA, pval = repNA)
# i = 0
for (cohort in unique(dat_prim$study_ID)) {
  # i = i+1
  res = NA
  res = meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        sm = "OR",
                        data = subset(dat_prim, study_ID != cohort))
  i = which(unique(dat_prim$study_ID) == cohort)

  res.JK$es[i] = res$TE.random
  res.JK$ci_lo[i] = res$lower.random
  res.JK$ci_up[i] = res$upper.random
  res.JK$pval[i] = res$pval.random
}
res.JK[,1:3] <- exp(res.JK[,1:3])
res.JK[order(res.JK$es), ]
##          es     ci_lo    ci_up      pval
## 39 1.010561 0.9910157 1.030491 0.2917637
## 18 1.020275 0.9857079 1.056054 0.2537071
## 2  1.020307 0.9859978 1.055810 0.2493402
## 25 1.020342 0.9857147 1.056186 0.2529647
## 23 1.021291 0.9869590 1.056818 0.2272147
## 15 1.021461 0.9860210 1.058175 0.2385597
## 11 1.021615 0.9867594 1.057701 0.2272820
## 14 1.021738 0.9866353 1.058090 0.2279548
## 10 1.021819 0.9862027 1.058721 0.2330943
## 30 1.022561 0.9879449 1.058391 0.2041825
## 28 1.022781 0.9879257 1.058866 0.2029155
## 12 1.022790 0.9870522 1.059822 0.2143127
## 37 1.022895 0.9881024 1.058912 0.1998169
## 1  1.022912 0.9881301 1.058917 0.1993386
## 41 1.023521 0.9887514 1.059514 0.1873544
## 21 1.023649 0.9878109 1.060787 0.1986258
## 22 1.023658 0.9886855 1.059868 0.1873741
## 17 1.023685 0.9873796 1.061324 0.2038764
## 13 1.024182 0.9895536 1.060021 0.1733362
## 26 1.024182 0.9895536 1.060021 0.1733362
## 8  1.024182 0.9895536 1.060021 0.1733362
## 42 1.024313 0.9892985 1.060567 0.1758391
## 32 1.024420 0.9874665 1.062756 0.1980578
## 40 1.024521 0.9890047 1.061312 0.1783810
## 29 1.024579 0.9875971 1.062945 0.1954698
## 16 1.025080 0.9891814 1.062281 0.1732291
## 24 1.025238 0.9896889 1.062064 0.1662610
## 38 1.025247 0.9883554 1.063516 0.1823613
## 35 1.025561 0.9906930 1.061657 0.1526753
## 9  1.025646 0.9898935 1.062690 0.1618611
## 7  1.025667 0.9902151 1.062387 0.1579280
## 20 1.025793 0.9908583 1.061959 0.1497316
## 27 1.025870 0.9909034 1.062071 0.1488782
## 34 1.025978 0.9909563 1.062237 0.1478169
## 3  1.026303 0.9904343 1.063471 0.1525983
## 33 1.026672 0.9921628 1.062383 0.1313152
## 5  1.027326 0.9924583 1.063419 0.1259519
## 31 1.027357 0.9925329 1.063403 0.1250362
## 6  1.027551 0.9926796 1.063647 0.1228634
## 19 1.028208 0.9937467 1.063864 0.1097509
## 36 1.028678 0.9930158 1.065621 0.1162683
## 4  1.030993 0.9976586 1.065441 0.0687326

2. Cook’s distance

Main model

res <- metafor::rma.mv(logOR ~ 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_prim)
x <- cooks.distance(res)
plot(x, type="o", pch=19, xlab="Observed Outcome", ylab="Cook's Distance")

influential <- unique(dat_prim$Study_name)[which(x > (3 * mean(x))) ]

dat_S8 <- dat_prim %>%
  filter(!Study_name %in% influential)

res_S8 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S8$N),
                        sm = "OR",
                        studlab = paste(dat_S8$Study_name),
                        data = dat_S8)
res_S8
## Number of studies combined: n = 40
## Number of estimates combined: k = 42
## Number of observations: o = 4620
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0142 [0.9944; 1.0344] 1.40  0.1613
## 
## Quantifying heterogeneity:
##  tau^2.1 < 0.0001 [0.0000; 0.0030]; tau.1 < 0.0001 [0.0000; 0.0552] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0019]; tau.2 < 0.0001 [0.0000; 0.0437] (within cluster)
##  I^2 = 10.6% [0.0%; 38.9%]; H = 1.06 [1.00; 1.28]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  45.84   41  0.2785
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S8,
           title = "Association of MoB with \n childhood ADHD")

3. Robust regression

Main model

dat_S5_cor <- data.frame(subset(dat_off, grepl("S6:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID)

dat_S5_uncor <- subset(dat_off, grepl("Primary", dat_off$Analysis, fixed = TRUE) & !Study %in% dat_S5_cor$Study)
dat_S5 = dplyr::bind_rows(dat_S5_cor, dat_S5_uncor)

res_S5 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S5$N),
                        sm = "OR",
                        studlab = paste(dat_S5$Study_name),
                        data = dat_S5)
res_S5
## Number of studies combined: n = 42
## Number of estimates combined: k = 44
## Number of observations: o = 4743
## 
##                          OR           95%-CI    z p-value
## Random effects model 1.0237 [0.9893; 1.0593] 1.34  0.1788
## 
## Quantifying heterogeneity:
##  tau^2.1 = 0.0042 [0.0000; 0.0115]; tau.1 = 0.0646 [0.0000; 0.1073] (between cluster)
##  tau^2.2 < 0.0001 [0.0000; 0.0076]; tau.2 < 0.0001 [0.0000; 0.0870] (within cluster)
##  I^2 = 41.0% [15.3%; 59.0%]; H = 1.30 [1.09; 1.56]
## 
## Test of heterogeneity:
##      Q d.f. p-value
##  72.92   43  0.0029
## 
## Details on meta-analytical method:
## - Inverse variance method (three-level model)
## - Restricted maximum-likelihood estimator for tau^2
## - Profile-Likelihood method for confidence interval of tau^2 and tau

Forest plot

fct_forest(data = res_S5,
           title = "Association of MoB with \n childhood ADHD")



S13. Meta-regressions

1. ADHD diagnosis tool

Model

dat_S9 = dat_prim

metafor::rma.mv(logOR ~ diag.procedure - 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_S9)
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed          factor 
## sigma^2.1  0.0044  0.0660     42     no        study_ID 
## sigma^2.2  0.0000  0.0000     44     no  study_ID/es_id 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 66.4096, p-val = 0.0072
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 2.8640, p-val = 0.4131
## 
## Model Results:
## 
##                                  estimate      se     zval    pval    ci.lb 
## diag.procedureBroad-based-scale   -0.0028  0.0344  -0.0820  0.9346  -0.0703 
## diag.procedureDiagnosis            0.0272  0.0246   1.1040  0.2696  -0.0211 
## diag.procedureSymptoms             0.0472  0.0369   1.2800  0.2005  -0.0251 
##                                   ci.ub 
## diag.procedureBroad-based-scale  0.0646    
## diag.procedureDiagnosis          0.0754    
## diag.procedureSymptoms           0.1196    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
metafor::rma.mv(logOR ~ diag.procedure.bas - 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_S9)
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed          factor 
## sigma^2.1  0.0042  0.0648     42     no        study_ID 
## sigma^2.2  0.0000  0.0000     44     no  study_ID/es_id 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 69.4594, p-val = 0.0036
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 5.1582, p-val = 0.1606
## 
## Model Results:
## 
##                                      estimate      se     zval    pval    ci.lb 
## diag.procedure.basBroad-based-scale   -0.0055  0.0389  -0.1404  0.8883  -0.0816 
## diag.procedure.basDiagnosis            0.0120  0.0229   0.5223  0.6014  -0.0330 
## diag.procedure.basSymptoms             0.0817  0.0370   2.2058  0.0274   0.0091 
##                                       ci.ub 
## diag.procedure.basBroad-based-scale  0.0707    
## diag.procedure.basDiagnosis          0.0569    
## diag.procedure.basSymptoms           0.1543  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
metafor::rma.mv(logOR ~ diag.procedure.follow - 1, V = seOR^2, random = ~ 1 | study_ID/es_id, data = dat_S9)
## 
## Multivariate Meta-Analysis Model (k = 44; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed          factor 
## sigma^2.1  0.0047  0.0688     42     no        study_ID 
## sigma^2.2  0.0000  0.0000     44     no  study_ID/es_id 
## 
## Test for Residual Heterogeneity:
## QE(df = 41) = 68.0074, p-val = 0.0051
## 
## Test of Moderators (coefficients 1:3):
## QM(df = 3) = 2.5242, p-val = 0.4709
## 
## Model Results:
## 
##                                         estimate      se     zval    pval 
## diag.procedure.followBroad-based-scale   -0.0030  0.0356  -0.0842  0.9329 
## diag.procedure.followDiagnosis            0.0344  0.0246   1.3988  0.1619 
## diag.procedure.followSymptoms             0.0294  0.0393   0.7486  0.4541 
##                                           ci.lb   ci.ub 
## diag.procedure.followBroad-based-scale  -0.0728  0.0668    
## diag.procedure.followDiagnosis          -0.0138  0.0826    
## diag.procedure.followSymptoms           -0.0476  0.1065    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_diag <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        subgroup = diag.procedure,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S9$N),
                        sm = "OR",
                        studlab = paste(dat_S9$Study_name),
                        data = dat_S9)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_diag,
           title = "Association of MoB with \n childhood ADHD")

2. ADHD subtypes

Main model

dat_S6 <- data.frame(subset(dat_off, grepl("S8:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID) %>%
  filter(Cut_off_date == "Official")

res_S6 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S6$N),
                        sm = "OR",
                        studlab = paste(dat_S6$Study_name),
                        data = dat_S6)

res_S6_reg = meta::metareg(res_S6, formula = Analysis, intercept = TRUE)
res_S6_reg
## 
## Multivariate Meta-Analysis Model (k = 31; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     19     no       .id 
## sigma^2.2  0.0029  0.0537     31     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 28) = 30.8794, p-val = 0.3225
## 
## Test of Moderators (coefficients 2:3):
## QM(df = 2) = 0.0762, p-val = 0.9626
## 
## Model Results:
## 
##                                       estimate      se     zval    pval 
## intrcpt                                -0.0007  0.0293  -0.0246  0.9804 
## AnalysisS8: Hyperactive presentation   -0.0062  0.0789  -0.0786  0.9373 
## AnalysisS8: Inattentive presentation   -0.0177  0.0645  -0.2741  0.7840 
##                                         ci.lb   ci.ub 
## intrcpt                               -0.0582  0.0567    
## AnalysisS8: Hyperactive presentation  -0.1609  0.1485    
## AnalysisS8: Inattentive presentation  -0.1441  0.1088    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_S6_plot <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        subgroup = Analysis,
                        n.e = as.numeric(dat_S6$N),
                        sm = "OR",
                        studlab = paste(dat_S6$Study_name),
                        data = dat_S6)
fct_forest(data = res_S6_plot,
           title = "Association of MoB with \n childhood ADHD")

3. Above vs. below IQ median

Main model

dat_S7 <- data.frame(subset(dat_off, grepl("S9:", dat_off$Analysis, fixed = TRUE))) %>%
  filter(!is.na(logOR)) %>%
  arrange(ID) %>%
  filter(Cut_off_date == "Official")

res_S7 <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        n.e = as.numeric(dat_S7$N),
                        sm = "OR",
                        studlab = paste(dat_S7$Study_name),
                        data = dat_S7)
res_S7_reg = meta::metareg(res_S7, formula = Analysis, intercept = TRUE)
res_S7_reg
## 
## Multivariate Meta-Analysis Model (k = 36; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     22     no       .id 
## sigma^2.2  0.0032  0.0563     36     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 34) = 42.0107, p-val = 0.1626
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.0137, p-val = 0.9069
## 
## Model Results:
## 
##                              estimate      se     zval    pval    ci.lb   ci.ub 
## intrcpt                        0.0205  0.0343   0.5981  0.5498  -0.0467  0.0877 
## AnalysisS9: IQ below median   -0.0054  0.0461  -0.1169  0.9069  -0.0957  0.0849 
##  
## intrcpt 
## AnalysisS9: IQ below median 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_S7_plot <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        subgroup = Analysis,
                        n.e = as.numeric(dat_S7$N),
                        sm = "OR",
                        studlab = paste(dat_S7$Study_name),
                        data = dat_S7)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_S7_plot,
           title = "Association of MoB with \n childhood ADHD")

4. Official vs. probable school-entry cut-off

Code

res_mod <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        subgroup = Cut_off_date,
                        n.e = as.numeric(dat_mod$N),
                        sm = "OR",
                        studlab = paste(dat_mod$Study_name),
                        data = dat_mod)
res_mod_reg = meta::metareg(res_mod, formula = Cut_off_date, intercept = TRUE)
res_mod_reg_woi = meta::metareg(res_mod, formula = Cut_off_date, intercept = FALSE)
res_mod_reg
## 
## Multivariate Meta-Analysis Model (k = 62; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0033  0.0571     58     no       .id 
## sigma^2.2  0.0000  0.0000     62     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 60) = 93.3278, p-val = 0.0038
## 
## Test of Moderators (coefficient 2):
## QM(df = 1) = 2.2403, p-val = 0.1345
## 
## Model Results:
## 
##                       estimate      se     zval    pval    ci.lb   ci.ub 
## intrcpt                 0.0241  0.0164   1.4738  0.1405  -0.0080  0.0562    
## Cut_off_dateProbable   -0.0466  0.0311  -1.4968  0.1345  -0.1075  0.0144    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res_mod_reg_woi
## 
## Multivariate Meta-Analysis Model (k = 62; method: REML)
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0033  0.0571     58     no       .id 
## sigma^2.2  0.0000  0.0000     62     no  .id/.idx 
## 
## Test for Residual Heterogeneity:
## QE(df = 60) = 93.3278, p-val = 0.0038
## 
## Test of Moderators (coefficients 1:2):
## QM(df = 2) = 2.8914, p-val = 0.2356
## 
## Model Results:
## 
##                       estimate      se     zval    pval    ci.lb   ci.ub 
## Cut_off_dateOfficial    0.0241  0.0164   1.4738  0.1405  -0.0080  0.0562    
## Cut_off_dateProbable   -0.0224  0.0265  -0.8481  0.3964  -0.0743  0.0294    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Forest plot

res_mod_plot <- meta::metagen(TE = logOR,
                        seTE = seOR,
                        id = study_ID,
                        method.tau = "REML",
                        subgroup = Cut_off_date,
                        n.e = as.numeric(dat_mod$N),
                        sm = "OR",
                        studlab = paste(dat_mod$Study_name),
                        data = dat_mod)
## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.

## Warning: Ratio of largest to smallest sampling variance extremely large. May not
## be able to obtain stable results.
fct_forest(data = res_mod_plot,
           title = "Association of MoB with \n childhood ADHD")